# -*- coding: utf-8 -*-
from match import Extractor
import os.path
import regex as re


class ZhaPianExtractor(Extractor):
    """
        诈骗罪量刑标准
        (1)三千元至一万元以上：数额较大：处三年以下有期徒刑、拘役或者管制，并处或者单处罚金。
        (2)三万元至十万元以上：数额巨大：处三年以上十年以下有期徒刑，并处罚金。
        (3)五十万元以上：数额特别巨大：处十年以上有期徒刑或者无期徒刑，并处罚金或者没收财产。

        诈骗罪的情节规定
         1、从重处罚的情形
        (1)通过发送短信、拨打电话或者利用互联网、广播电视、报刊杂志等发布虚假信息，对不特定多数人实施诈骗的；
        (2)诈骗救灾、抢险、防汛、优抚、扶贫、移民、救济、医疗款物的；
        (3)以赈灾募捐名义实施诈骗的；
        (4)诈骗残疾人、老年人或者丧失劳动能力人的财物的；
        (5)造成被害人自杀、精神失常或者其他严重后果的。
        另外，诈骗数额接近本解释第一条规定的“数额巨大”、“数额特别巨大”的标准，并具上述情形之一或者属于诈骗集团首要分子的，应当分别认定为刑法第二百六十六条规定的“其他严重情节”、“其他特别严重情节”。
        2、免刑事处罚的情形
        下列情节中，犯罪行为人有认罪、悔罪的主观意识的，可以起诉或者免予刑事处罚：
        (1)具有法定从宽处罚情节的；
        (2)一审宣判前全部退赃、退赔的；
        (3)没有参与分赃或者获赃较少且不是主犯的；
        (4)被害人谅解的；
        (5)其他情节轻微、危害不大的。
    """

    @staticmethod
    def is_my_job(file_path):
        return "诈骗" in file_path

    @staticmethod
    def extract(text):
        result = {}
        result['数额巨大'] = re.search(r"数额巨大", text) is not None  # 涉及金额是否巨大？（三万元至十万元以上属于巨大）
        result['数额特别巨大'] = re.search(r"特别巨大", text) is not None # 涉及金额是否特别巨大？（十万元以上属于巨大）
        result['电信诈骗'] = re.search(r"互联网|电信|短信诈骗|电话诈骗|广播电视|虚假信息|电话骗|短信骗|诈骗团伙",
                                   text) is not None  # 是否属于电信诈骗？ （通过发送短信、拨打电话或者利用互联网、广播电视、报刊杂志等发布虚假信息，对不特定多数人实施诈骗的；）
        result['退赃退赔'] = re.search(r"退赔|退赃", text) is not None  # 是否退赃、退赔？ （一审宣判前全部退赃、退赔的）
        result['金融诈骗'] = re.search(r"信用卡|贷款|理财|集资诈骗", text) is not None  # 是否涉及金融诈骗？
        result['被害人或者被害人家属谅解'] = re.search(r"谅解", text) is not None  # 是否取得被害人谅解？

        return result


if __name__ == '__main__':
    from match import *
    from storage import *
    import json
    import os

    data_util = DataUtil("E:/project/yaosu_law/pro_yaosu/诈骗罪")
    extractors = [ZhaPianExtractor]

    file_path, text = data_util.next_line()
    count_dict = {}
    count_key_list = ["数额巨大", "数额特别巨大", "电信诈骗", "退赃退赔", "金融诈骗", "被害人或者被害人家属谅解"]
    while text:
        text_json = json.loads(text)
        if file_path not in count_dict:
            count_dict[file_path] = {"count": 0}
        for extractor in extractors:
            if extractor.is_my_job(file_path):
                result = extractor.extract("\n".join(text_json["content"]))
                for key in count_key_list:
                    result_value = result[key]
                    if type(result_value) == int or type(result_value) == float:
                        if key in count_dict[file_path]:
                            count_dict[file_path][key] = count_dict[file_path][key] + result_value
                        else:
                            count_dict[file_path][key] = result_value
                    else:
                        if key in count_dict[file_path]:
                            if result_value in count_dict[file_path][key]:
                                count_dict[file_path][key][result_value] = count_dict[file_path][key][result_value] + 1
                            else:
                                count_dict[file_path][key][result_value] = 1
                        else:
                            count_dict[file_path][key] = {}
                            count_dict[file_path][key][result_value] = 1
        count_dict[file_path]["count"] = count_dict[file_path]["count"] + 1
        file_path, text = data_util.next_line()
    for key in count_dict:
        print(key)
        count = count_dict[key]["count"]
        for ckey in count_key_list:
            ckey_result = count_dict[key][ckey]
            if (type(ckey_result) == int or type(ckey_result) == float):
                print(str(ckey) + ":%f" % (ckey_result / float(count)))
            else:
                for cckey in ckey_result:
                    print(str(ckey) + "_" + str(cckey) + ":%f" % (ckey_result[cckey] / float(count)))
    print(count_dict)
